package com.postaop.hntl.front.iso8583;

/**
 * 域属性对象
 * @author Karma
 */
public class IsoFieldProperty {
	//值域
	private IsoElementProperty field;
	//长度域，如果为变长，则存在此长度域
	private IsoElementProperty length;
	
	public IsoElementProperty getField() {
		return field;
	}
	public void setField(IsoElementProperty field) {
		this.field = field;
		setDefaultFieldParam(field);
	}
	public IsoElementProperty getLength() {
		return length;
	}
	public void setLength(IsoElementProperty length) {
		this.length = length;
		setDefaultLengthParam(length);
	}
	
	private void setDefaultFieldParam(IsoElementProperty value) {
		if(value.getMsgType() == IsoMsgType.FIXED&&
				null == value.getLength()){
			throw new RuntimeException("定长域必须设置长度");
		}
		//对齐方向为空,则默认使用右对齐
		if(null == value.getFillDirectType()){
			value.setFillDirectType(IsoFillDirectType.RIGHT);
		}
		//无补充的类型，则默认补0
		if(null == value.getFillType()){
			value.setFillType(IsoFillType.BLANK);
		}
	}
	
	private void setDefaultLengthParam(IsoElementProperty length) {
		if(length.getDataType() == IsoDataType.BCD){
			throw new RuntimeException("长度域只能用类型:"+IsoDataType.BIN);
		}
		if(null == length.getLength()){
			throw new RuntimeException("长度域必须设置长度");
		}
		
		//强行设置长度域为定长
		length.setMsgType(IsoMsgType.FIXED);
		//补齐方向为空,则默认使用右补齐
		if(null == length.getFillDirectType()){
			length.setFillDirectType(IsoFillDirectType.LEFT);
		}
		//无补充的类型，则默认补0
		if(null == length.getFillType()){
			length.setFillType(IsoFillType.ZERO);
		}
	}
}
